import React, { useState } from 'react';
import * as XLSX from 'xlsx';
import PropTypes from 'prop-types';
import { Button, message } from "antd";

const MAX_ROWS_PER_SHEET = 300000;

const ExcelExporter = ({
  onRequestData,       // ✅ 异步请求函数，返回完整数组
  headers,
  fileName,
  buttonText,
  className,
  type
}) => {
  const [loading, setLoading] = useState(false);

  const exportToExcel = async () => {
    setLoading(true);
    try {
      const data = await onRequestData();
      if (!data || data.length === 0) {
        message.warning("暂无可导出的数据");
        setLoading(false);
        return;
      }

      const workbook = XLSX.utils.book_new();
      const totalRows = data.length;
      const totalSheets = Math.ceil(totalRows / MAX_ROWS_PER_SHEET);

      for (let i = 0; i < totalSheets; i++) {
        const chunk = data.slice(i * MAX_ROWS_PER_SHEET, (i + 1) * MAX_ROWS_PER_SHEET);
        const sheetData = [
          headers.map(h => h.label),
          ...chunk.map(row =>
            headers.map(h => {
              const keys = h.key.split('.');
              const value = keys.reduce((obj, key) => obj?.[key], row);
              return value ?? '';
            })
          )
        ];

        const sheet = XLSX.utils.aoa_to_sheet(sheetData);
        const sheetName = `Sheet${i + 1}`;
        XLSX.utils.book_append_sheet(workbook, sheet, sheetName);
      }

      XLSX.writeFile(workbook, fileName || `export_${new Date().toISOString().slice(0, 10)}.xlsx`);
    } catch (error) {
      console.error('导出Excel失败:', error);
      message.error('导出失败，请稍后重试');
    } finally {
      setLoading(false);
    }
  };

  return (
    <Button
      onClick={exportToExcel}
      className={className}
      type={type}
      loading={loading}
    >
      {buttonText || '下载'}
    </Button>
  );
};

ExcelExporter.propTypes = {
  onRequestData: PropTypes.func.isRequired,
  headers: PropTypes.arrayOf(
    PropTypes.shape({
      key: PropTypes.string.isRequired,
      label: PropTypes.string.isRequired
    })
  ).isRequired,
  fileName: PropTypes.string,
  buttonText: PropTypes.string,
  className: PropTypes.string,
  type: PropTypes.string
};

export default ExcelExporter;
// import React from 'react';
// import * as XLSX from 'xlsx';
// import PropTypes from 'prop-types';
// import { Button } from "antd";
// const ExcelExporter = ({ 
//   data, 
//   headers, 
//   fileName, 
//   buttonText, 
//   className, 
//   type,
//   // style 
// }) => {
//   const exportToExcel = () => {
//     try {
//       // 创建工作表数据
//       const wsData = [
//         headers.map(header => header.label), // 表头行
//         ...data.map(row => 
//           headers.map(header => {
//             // 处理嵌套数据（例如：user.name）
//             const keys = header.key.split('.');
//             const value = keys.reduce((obj, key) => obj?.[key], row);
//             return value ?? '';
//           })
//         )
//       ];

//       // 创建工作簿和工作表
//       const ws = XLSX.utils.aoa_to_sheet(wsData);
//       const wb = XLSX.utils.book_new();
//       XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');

//       // 生成并下载文件
//       XLSX.writeFile(wb, fileName || `export_${new Date().toISOString().slice(0,10)}.xlsx`);
//     } catch (error) {
//       console.error('导出Excel失败:', error);
//       // 可以添加错误处理逻辑，例如显示提示信息
//     }
//   };

//   return (
//     <Button
//       onClick={exportToExcel}
//       className={className}
//       type={type}
//       // style={style}
//       disabled={!data || data.length === 0}
//     >
//       {buttonText || '下载'}
//     </Button>
//   );
// };

// ExcelExporter.propTypes = {
//   data: PropTypes.arrayOf(PropTypes.object).isRequired,
//   headers: PropTypes.arrayOf(
//     PropTypes.shape({
//       key: PropTypes.string.isRequired,
//       label: PropTypes.string.isRequired
//     })
//   ).isRequired,
//   fileName: PropTypes.string,
//   // buttonText: PropTypes.string,
//   className: PropTypes.string,
//   // style: PropTypes.object,
//   type: PropTypes.string
// };

// export default ExcelExporter;